package br.com.jdcanado.gae.inforse.controller;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import java.net.URL;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;

import org.primefaces.context.RequestContext;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.awt.Color;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;

import br.com.jdcanado.gae.inforse.model.CustoProfissionais;
import br.com.jdcanado.gae.inforse.model.Encargo;
import br.com.jdcanado.gae.inforse.model.Orcamento;
import br.com.jdcanado.gae.inforse.model.OrcamentoDAO;
import br.com.jdcanado.gae.inforse.model.TotalOrcamental;
import br.com.jdcanado.gae.inforse.model.Usuario;
import br.com.jdcanado.gae.inforse.model.ValorOrcamento;
import br.com.jdcanado.gae.inforse.model.ValorOrcamento.CustoFixo;
import br.com.jdcanado.gae.inforse.model.ValorOrcamento.CustoOperacional;
import br.com.jdcanado.gae.inforse.model.ValorOrcamentoDAO;

@ManagedBean(name="orcamentoMB")
@ApplicationScoped
public class OrcamentoMB implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private List<Orcamento> listaOrcamentos;
	
	private Orcamento orcamento = new Orcamento();
	
	private Orcamento selectedOrcamento = new Orcamento();
	
	private CustoProfissionais custoProfissionais = new CustoProfissionais();
	
	private CustoProfissionais selectedCustoProfissionais = new CustoProfissionais();
	
	private List<CustoProfissionais> listaProfissionais = new ArrayList<CustoProfissionais>();
	
	private Encargo encargo = new Encargo();
	
	private Encargo selectedEncargo = new Encargo();
	
	private List<Encargo> listaEncargos = new ArrayList<Encargo>();
	
	//propriedades preenchidas pelo evento onBlur
	private float encargosProLabore;
	
	private float encargosSociaisProLabore;
	
	private float totalCusto;
	
	private float valorCustoHora;
	
	private float totalGasto;
	
	private float consumoLitro;
	
	private float depreciacaoVeicular;
	
	private float qtdTotalProfissionais;
	
	private float totalAlimentacao;
	
	private float totalAcomodacao;
	
	private float totalTransporteAereo;
	
	private float totalCustoOperacional;
	
	private float totalOrcamento;
	
	private float totalOrcamentoDesconto;
	
	private float totalAluguelCarro;
	
	//constantes do Custo Fixo
	private final float PROLABORE = 2500;
	private final float SALARIO_ADMINISTRATIVO = 5000;
	private final float SEGUROS = 40;
	private final float DESPESAS_BANCARIAS = 160;
	private final float JUROS = 200;
	private final float HONORARIOS_CONTABEIS = 400;
	private final float MATERIAL_EXPEDIENTE = 250;
	private final float ALUGUEL = 250;
	private final float DESPESAS_VIAGENS = 50;
	private final float AGUA = 50;
	private final float LUZ = 150;
	private final float TELEFONE = 600;
	private final float PUBLICIDADE_ADWORD = 400;
	private final float SERVICOS_INTERNET = 100;
	private final float MANUTENCAO_VEICULAR = 100;
	private final float PERTINENTES_VARIADOS = 200;
	private final float OUTROS = 100;
	private final float QTD_HORAS_MES = 176;
	
	//constantes do Custo Profissional	
	private final float QTD_PROFISSIONAIS = 1;
	private final float SALARIO_PROFISSIONAL = 5500;
	private final float ENCARGO_PROFISSIONAL = 35;
	private final float HORAS_MES = 176;
	private final float HORAS_REALIZADAS = 1;
	private final String PROFISSAO = "Engenheiro";
	
	//constantes do Custo Operacional
	private final float KM_RODADOS = 900;
	private final float KM_LITRO = 10;
	private final float VALOR_LITRO = 2.8f;
	private final float VALOR_DEPRECIACAO = 0.25f;
	private final float DIAS_ALIMENTACAO = 5;
	private final float VALOR_REFEICAO = 25;
	private final float QTD_REFEICOES = 2;
	private final float DIAS_REFEICAO = 4;
	private final float VALOR_ACOMODACAO = 120;
	private final float QTD_PASSAGEM = 0;
	private final float VALOR_PASSAGEM = 0;
	private final float QTD_DIAS_ALUGUEL_CARRO = 0;
	private final float VALOR_ALUGUEL_CARRO = 130;
	private final float PEDAGIO = 140;
	private final float PERTINENTES = 80;
	
	//constantes do Total Orçamental
	private final float QTD_HORAS_VIAGEM = 10;
	private final float QTD_HORAS_VISTORIA = 40;
	private final float QTD_HORAS_COMPLEMENTOS = 1;
	private final float QTD_HORAS_CUSTO_FIXO = 51;
	private final float PORCENTAGEM_LUCRO = 27;
	private final float PORCENTAGEM_COMISSAO_VENDAS = 5;
	private final float PORCENTAGEM_SIMPLES = 6;
	private final float VALOR_COMISSAO_VENDAS = 516.22f;
	private final float VALOR_SIMPLES = 619.47f;
	private final float VALOR_LUCRO = 2787.61f;
	
	
	
	public OrcamentoMB(){
		
	}
	
	public void preencherListaOrcamentos(ActionEvent event){
		Usuario usuario = (Usuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("currentUser");
		setListaOrcamentos(OrcamentoDAO.queryOrcamentosByUsuario(usuario));		
	}
	
	public void prepararInserirCustoFixo(){
		getListaProfissionais().clear();
		getListaEncargos().clear();
		
		if(getSelectedOrcamento().getValorOrcamento() == null){
			getSelectedOrcamento().setValorOrcamento(new ValorOrcamento());
			getSelectedOrcamento().getValorOrcamento().setCustoFixo(new CustoFixo());
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setProLabore(PROLABORE);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setSalarioAdministrativo(SALARIO_ADMINISTRATIVO);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setSeguros(SEGUROS);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setDespesasBancarias(DESPESAS_BANCARIAS);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setJuros(JUROS);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setHonorariosContabeis(HONORARIOS_CONTABEIS);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setMaterialExpediente(MATERIAL_EXPEDIENTE);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setAluguel(ALUGUEL);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setDespesaViagens(DESPESAS_VIAGENS);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setAgua(AGUA);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setLuz(LUZ);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setTelefone(TELEFONE);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setPublicidade(PUBLICIDADE_ADWORD);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setServicosInternet(SERVICOS_INTERNET);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setManutencaoVeicular(MANUTENCAO_VEICULAR);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setOutros(OUTROS);
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setPertinentesVariados(PERTINENTES_VARIADOS);	
			getSelectedOrcamento().getValorOrcamento().getCustoFixo().setQtdHorasMes(QTD_HORAS_MES);
			getSelectedOrcamento().getValorOrcamento().setCustoProfissionaisSets(new ArrayList<CustoProfissionais>());
			
			CustoProfissionais profissionalFixo = new CustoProfissionais();
			profissionalFixo.setProfissao(PROFISSAO);
			profissionalFixo.setQtdProfissionais(QTD_PROFISSIONAIS);
			profissionalFixo.setSalario(SALARIO_PROFISSIONAL);
			profissionalFixo.setEncargos(ENCARGO_PROFISSIONAL);
			profissionalFixo.setHorasMes(HORAS_MES);
			profissionalFixo.setHorasRealizadas(HORAS_REALIZADAS);
			profissionalFixo.setSalariosEncargos(profissionalFixo.getSalario() * (1 + profissionalFixo.getEncargos() / 100));
			profissionalFixo.setCustoHora(profissionalFixo.getSalariosEncargos() / profissionalFixo.getHorasMes());
			profissionalFixo.setCustoMedio(profissionalFixo.getHorasRealizadas() * profissionalFixo.getCustoHora() * profissionalFixo.getQtdProfissionais());
			
			ValorOrcamentoDAO.inserirCustoProfissionais(profissionalFixo, getSelectedOrcamento().getValorOrcamento().getId());
			
			getListaProfissionais().add(profissionalFixo);
			
			getSelectedOrcamento().getValorOrcamento().getCustoProfissionaisSets().add(profissionalFixo);
			
			CustoOperacional custoOperacional = new CustoOperacional();
			custoOperacional.setKmRodados(KM_RODADOS);
			custoOperacional.setKmLitro(KM_LITRO);
			custoOperacional.setValorLitro(VALOR_LITRO);
			custoOperacional.setValorDepreciacao(VALOR_DEPRECIACAO);
			custoOperacional.setDiasAlimentacao(DIAS_ALIMENTACAO);
			custoOperacional.setValorRefeicao(VALOR_REFEICAO);
			custoOperacional.setQtdRefeicoes(QTD_REFEICOES);
			custoOperacional.setDiasAcomodacao(DIAS_REFEICAO);
			custoOperacional.setValorAcomodacao(VALOR_ACOMODACAO);
			custoOperacional.setQtdPassagem(QTD_PASSAGEM);
			custoOperacional.setValorPassagem(VALOR_PASSAGEM);
			custoOperacional.setQtdDiasAluguelCarro(QTD_DIAS_ALUGUEL_CARRO);
			custoOperacional.setValorAluguelCarro(VALOR_ALUGUEL_CARRO);
			custoOperacional.setPedagio(PEDAGIO);
			custoOperacional.setPertinentes(PERTINENTES);
			
			getSelectedOrcamento().getValorOrcamento().setCustoOperacional(custoOperacional);
			
			TotalOrcamental totalOrcamental = new TotalOrcamental();
			totalOrcamental.setQtdHorasViagem(QTD_HORAS_VIAGEM);
			totalOrcamental.setQtdHorasVistoria(QTD_HORAS_VISTORIA);
			totalOrcamental.setQtdHorasComplementos(QTD_HORAS_COMPLEMENTOS);
			totalOrcamental.setQtdHorasCustoFixo(QTD_HORAS_CUSTO_FIXO);
			totalOrcamental.setPorcentagemLucro(PORCENTAGEM_LUCRO);
			totalOrcamental.setValorLucro(VALOR_LUCRO);
			totalOrcamental.setEncargoSets(new ArrayList<Encargo>());
						
			Encargo comissaoVendas = new Encargo();
			Encargo simples = new Encargo();
			
			comissaoVendas.setDescricao("COMISSÃO VENDAS");
			comissaoVendas.setPorcentagemEncargo(PORCENTAGEM_COMISSAO_VENDAS);
			comissaoVendas.setValorEncargo(VALOR_COMISSAO_VENDAS);
			simples.setDescricao("SIMPLES");
			simples.setPorcentagemEncargo(PORCENTAGEM_SIMPLES);
			simples.setValorEncargo(VALOR_SIMPLES);
			
			listaEncargos.add(comissaoVendas);
			listaEncargos.add(simples);
			
			totalOrcamental.getEncargoSets().add(comissaoVendas);
			totalOrcamental.getEncargoSets().add(simples);			
			
			getSelectedOrcamento().getValorOrcamento().setTotalOrcamental(totalOrcamental);
			
			calcularEncargosProLabore();
			calcularEncargosSociaisProLabore();
			calcularCustoTotalCustoHora();			
		}else{
			calcularEncargosProLabore();
			calcularEncargosSociaisProLabore();
			calcularCustoTotalCustoHora();			
						
			if(getSelectedOrcamento().getValorOrcamento().getCustoProfissionaisSets().size() > 0){
				for(CustoProfissionais p : getSelectedOrcamento().getValorOrcamento().getCustoProfissionaisSets()){
					getListaProfissionais().add(p);
				}
			}
			
			if(getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getEncargoSets().size() > 0){
				for(Encargo e : getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getEncargoSets()){
					getListaEncargos().add(e);
				}
			}
			
			calcularTotalOrcamento();
			//calcularTotalOrcamentoDesconto();
		}
	}
	
	public void prepararInserirCustoOperacional(ActionEvent event){
		calcularDespesaCarro();
		calcularAlimentacao();
		calcularAcomodacao();
		calcularTransporteAereo();
		calcularAluguelCarro();
		calcularTotalCustoOperacional();
	}
	
	public void prepararInserirCustoOperacional(){
		calcularDespesaCarro();
		calcularAlimentacao();
		calcularAcomodacao();
		calcularTransporteAereo();
		calcularAluguelCarro();
		calcularTotalCustoOperacional();
	}
	
	public void inserirProfissional(ActionEvent event){
		getCustoProfissionais().setSalariosEncargos(getCustoProfissionais().getSalario() * (1 + getCustoProfissionais().getEncargos() / 100));
		getCustoProfissionais().setCustoHora(getCustoProfissionais().getSalariosEncargos() / getCustoProfissionais().getHorasMes());
		getCustoProfissionais().setCustoMedio(getCustoProfissionais().getHorasRealizadas() * getCustoProfissionais().getCustoHora() * getCustoProfissionais().getQtdProfissionais());
		
		ValorOrcamentoDAO.inserirCustoProfissionais(getCustoProfissionais(), getSelectedOrcamento().getValorOrcamento().getId());
		
		getListaProfissionais().add(getCustoProfissionais());
		
		limparProfissional();
	}
	
	public void inserirEncargo(ActionEvent event){
		getEncargo().setValorEncargo(getEncargo().getPorcentagemEncargo() * getTotalOrcamento() / 100);
		getListaEncargos().add(getEncargo());
		ValorOrcamentoDAO.inserirEncargo(getEncargo(), getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getId());
		calcularTotalOrcamento();	
		limparEncargo();
	}
	
	public void removerProfissional(ActionEvent event){
		ValorOrcamentoDAO.removerCustoProfissionais(getSelectedCustoProfissionais(), getSelectedOrcamento().getValorOrcamento().getId());
		
		for(int i=0; i < getListaProfissionais().size();i++){
			if(getSelectedCustoProfissionais().getId().getId() == getListaProfissionais().get(i).getId().getId()){
				getListaProfissionais().remove(i);
			}
		}
	}
	
	public void removerEncargo(ActionEvent event){
		ValorOrcamentoDAO.removerEncargo(getSelectedEncargo(), getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getId());
		
		for(int i = 0; i < getListaEncargos().size(); i++){
			if(getListaEncargos().get(i).getDescricao().equals(getSelectedEncargo().getDescricao())){
				getListaEncargos().remove(i);
			}				
		}
		
		calcularTotalOrcamento();
	}
	
	public void prepararGerarOrcamento(ActionEvent event){		
		RequestContext context = RequestContext.getCurrentInstance();  
        Boolean validouOrcamento = Boolean.TRUE;
		
		if(getSelectedOrcamento() == null){
			FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_WARN, "Selecione um orçamento!", null);
			FacesContext.getCurrentInstance().addMessage(null, fm);
			validouOrcamento = Boolean.FALSE;
		}else if(getSelectedOrcamento().getStatus().equals("Em Espera")){
			FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_WARN, "Calcule o orçamento!", null);
			FacesContext.getCurrentInstance().addMessage(null, fm);
			validouOrcamento = Boolean.FALSE;
		}
		
		context.addCallbackParam("validouOrcamento", validouOrcamento);			
	}
	
	public void gerarOrcamento(ActionEvent event){
		calcularOrcamento();
		
		Document document = new Document();
		document.setMargins(30f, 30f, 15f, 5.f);
		
        try {
        	HttpServletResponse res = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();  
			
        	ByteArrayOutputStream baos = new ByteArrayOutputStream();
        	
			PdfWriter.getInstance(document, baos);
            
            document.open();
            document.setPageSize(PageSize.A4);            
            
            ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();  
            String url = servletContext.getRealPath("") + File.separator + "imagens" + File.separator + "logo_orcamento.jpg";  
            Image logoCabecalho = Image.getInstance(url);            
            
            //Corpo do orçamento
            PdfPTable tableCorpo = new PdfPTable(4);            
            
            float [] fCorpo = {1.2f, 1.8f, 1.1f, 1.9f};
            tableCorpo.setWidths(fCorpo);
            tableCorpo.setWidthPercentage(100f);
            tableCorpo.setSpacingBefore(10f);
            tableCorpo.setSpacingAfter(10f);
                 
            BaseFont times = BaseFont.createFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, BaseFont.EMBEDDED);
            Font fontCorpo = new Font(times, 12f, Font.TIMES_ROMAN);
            Font fontCorpoNegrito = new Font(times, 12f, Font.BOLD);
            Font fontCorpoValor = new Font(times, 14f, Font.BOLD);
            Font fontCorpoTitulo = new Font(times, 11f, Font.ITALIC);
            Font fontRodape = new Font(times, 10f, Font.BOLD);
            fontRodape.setColor(Color.white);

            PdfPCell cellRowCorpoTitulo = new PdfPCell(new Paragraph("Dados do Orçamento", fontCorpoTitulo));
            cellRowCorpoTitulo.setColspan(4);
            cellRowCorpoTitulo.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTitulo.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTitulo.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpoTitulo.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpoTitulo.disableBorderSide(PdfPCell.BOTTOM);
            
            PdfPCell cellRowCorpo1 = new PdfPCell(new Paragraph("Nº do Orçamento:", fontCorpoNegrito));
            cellRowCorpo1.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo1.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpo1.disableBorderSide(PdfPCell.BOTTOM);
                   
            PdfPCell cellRowCorpo2 = new PdfPCell(new Paragraph("" + getSelectedOrcamento().getId().getId(), fontCorpo));
            cellRowCorpo2.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo2.disableBorderSide(PdfPCell.LEFT); 
            cellRowCorpo2.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpo2.disableBorderSide(PdfPCell.BOTTOM);
            
            PdfPCell cellRowCorpo3 = new PdfPCell(new Paragraph("Data:", fontCorpoNegrito));
            cellRowCorpo3.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo3.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpo3.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpo3.disableBorderSide(PdfPCell.BOTTOM);

            SimpleDateFormat sdf = new SimpleDateFormat("EEEE, dd/MM/yyyy hh:mm:ss");
            sdf.setTimeZone(TimeZone.getTimeZone("GMT-2"));
            
            PdfPCell cellRowCorpo4 = new PdfPCell(new Paragraph(sdf.format(new Date().getTime()), fontCorpo));
            cellRowCorpo4.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo4.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpo4.disableBorderSide(PdfPCell.BOTTOM);
                        
            PdfPCell cellRowCorpo5 = new PdfPCell(new Paragraph("Orçamento de Laudo Técnico de Energia Elétrica para a U.C.:", fontCorpoNegrito));
            cellRowCorpo5.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo5.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpo5.disableBorderSide(PdfPCell.TOP);
            cellRowCorpo5.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpo5.setColspan(3);
            
            PdfPCell cellRowCorpo6 = new PdfPCell(new Paragraph(getSelectedOrcamento().getCliente().getUnidadeConsumidora(), fontCorpo));
            cellRowCorpo6.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo6.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpo6.disableBorderSide(PdfPCell.TOP);
            cellRowCorpo6.disableBorderSide(PdfPCell.BOTTOM);
                     
            PdfPCell cellRowCorpo7 = new PdfPCell(new Paragraph("Nome/Razão Social:", fontCorpoNegrito));
            cellRowCorpo7.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo7.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpo7.disableBorderSide(PdfPCell.TOP);
            cellRowCorpo7.disableBorderSide(PdfPCell.BOTTOM);
            
            PdfPCell cellRowCorpo8 = new PdfPCell(new Paragraph(getSelectedOrcamento().getCliente().getRazaoSocial(), fontCorpo));
            cellRowCorpo8.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo8.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpo8.disableBorderSide(PdfPCell.TOP);
            cellRowCorpo8.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpo8.setColspan(3);
            
            PdfPCell cellRowCorpo9 = new PdfPCell(new Paragraph("CNPJ:", fontCorpoNegrito));
            cellRowCorpo9.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo9.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpo9.disableBorderSide(PdfPCell.TOP);
            cellRowCorpo9.disableBorderSide(PdfPCell.BOTTOM);
                   
            PdfPCell cellRowCorpo10 = new PdfPCell(new Paragraph(getSelectedOrcamento().getCliente().getCnpj(), fontCorpo));
            cellRowCorpo10.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo10.disableBorderSide(PdfPCell.LEFT); 
            cellRowCorpo10.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpo10.disableBorderSide(PdfPCell.TOP);
            cellRowCorpo10.disableBorderSide(PdfPCell.BOTTOM);
            
            PdfPCell cellRowCorpo11 = new PdfPCell(new Paragraph("Inscrição Estadual:", fontCorpoNegrito));
            cellRowCorpo11.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo11.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpo11.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpo11.disableBorderSide(PdfPCell.TOP);
            cellRowCorpo11.disableBorderSide(PdfPCell.BOTTOM);
                                    
            PdfPCell cellRowCorpo12 = new PdfPCell(new Paragraph(getSelectedOrcamento().getCliente().getInscricaoEstadual(), fontCorpo));
            cellRowCorpo12.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo12.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpo12.disableBorderSide(PdfPCell.TOP);
            cellRowCorpo12.disableBorderSide(PdfPCell.BOTTOM);
                        
            PdfPCell cellRowCorpo13 = new PdfPCell(new Paragraph("Responsável:", fontCorpoNegrito));
            cellRowCorpo13.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo13.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpo13.disableBorderSide(PdfPCell.TOP);
            cellRowCorpo13.disableBorderSide(PdfPCell.BOTTOM);
                               
            PdfPCell cellRowCorpo14 = new PdfPCell(new Paragraph(getSelectedOrcamento().getCliente().getContato(), fontCorpo));
            cellRowCorpo14.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo14.disableBorderSide(PdfPCell.LEFT); 
            cellRowCorpo14.disableBorderSide(PdfPCell.TOP);
            cellRowCorpo14.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpo14.setColspan(3);
            
            PdfPCell cellRowCorpo15 = new PdfPCell(new Paragraph("Contatos:", fontCorpoNegrito));
            cellRowCorpo15.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo15.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpo15.disableBorderSide(PdfPCell.TOP);
                                                            
            PdfPCell cellRowCorpo16 = new PdfPCell(new Paragraph(getSelectedOrcamento().getCliente().getTelefone() + " " + getSelectedOrcamento().getCliente().getCelular() + " " + getSelectedOrcamento().getCliente().getEmail(), fontCorpo));
            cellRowCorpo16.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpo16.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpo16.disableBorderSide(PdfPCell.TOP);
            cellRowCorpo16.setColspan(3);
            
            tableCorpo.addCell(cellRowCorpoTitulo);
            tableCorpo.addCell(cellRowCorpo1);
            tableCorpo.addCell(cellRowCorpo2);
            tableCorpo.addCell(cellRowCorpo3);
            tableCorpo.addCell(cellRowCorpo4);
            tableCorpo.addCell(cellRowCorpo5);
            tableCorpo.addCell(cellRowCorpo6);
            tableCorpo.addCell(cellRowCorpo7);
            tableCorpo.addCell(cellRowCorpo8);
            tableCorpo.addCell(cellRowCorpo9);
            tableCorpo.addCell(cellRowCorpo10);
            tableCorpo.addCell(cellRowCorpo11);
            tableCorpo.addCell(cellRowCorpo12);
            tableCorpo.addCell(cellRowCorpo13);
            tableCorpo.addCell(cellRowCorpo14);
            tableCorpo.addCell(cellRowCorpo15);
            tableCorpo.addCell(cellRowCorpo16);
            
            //Corpo do orçamento
            PdfPTable tableCorpoTexto = new PdfPTable(1);            
            
            float [] fCorpoTexto = {6f};
            tableCorpoTexto.setWidths(fCorpoTexto);
            tableCorpoTexto.setWidthPercentage(100f);
            //tableCorpoTexto.setSpacingAfter(20f);
            
            PdfPCell cellRowCorpoTextoTitulo = new PdfPCell(new Paragraph("Proposta e Regulamentação",fontCorpoTitulo));          		
            cellRowCorpoTextoTitulo.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTextoTitulo.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTextoTitulo.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpoTextoTitulo.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpoTextoTitulo.disableBorderSide(PdfPCell.BOTTOM);            
                        
            PdfPCell cellRowCorpoTexto1 = new PdfPCell(new Paragraph("Temos a satisfação de apresentarmos a nossa PROPOSTA COMERCIAL acompanhada das condições" +
            		" abaixo previstas.",fontCorpo));          		
            
            cellRowCorpoTexto1.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTexto1.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTexto1.setPaddingLeft(5f);
            cellRowCorpoTexto1.setPaddingTop(5f);
            
            PdfPCell cellRowCorpoTexto2 = new PdfPCell(new Paragraph("O Escopo da nossa Solução será o desenvolvimento de um projeto de LAUDO TÉCNICO DE ENERGIA ELÉTRICA com o objetivo de" +
            		" separar o Consumo(Kwh) da Energia Elétrica da Empresa em Setor de Produção e Setor Administrativo obtendo como resultado o Índice Técnico" +
            		" (%), necessário a Operação Contábil fiscal para o aproveitamento do ICMS das Contas/Faturas de Energia Elétrica de sua Empresa.",fontCorpo));
            
            cellRowCorpoTexto2.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTexto2.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTexto2.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTexto2.setPaddingLeft(5f);
            
            PdfPCell cellRowCorpoTexto3 = new PdfPCell(new Paragraph("O artigo 1º das Disposições Transitórias do RICMS estabelece, que o crédito do imposto em relação " +
            		"à entrada de energia elétrica, ocorridos no período de 1º de janeiro de 2011 e até 31 de dezembro de 2019, somente será efetuado quando: ",fontCorpo));
            
            cellRowCorpoTexto3.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTexto3.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTexto3.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTexto3.setPaddingLeft(5f);
            
            PdfPCell cellRowCorpoTexto4 = new PdfPCell(new Paragraph("- For objeto de operação de saída de energia elétrica;", fontCorpo));
            cellRowCorpoTexto4.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTexto4.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTexto4.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTexto4.setPaddingLeft(20f);
            
            PdfPCell cellRowCorpoTexto5 = new PdfPCell(new Paragraph("- For consumida no processo industrial;", fontCorpo));
            cellRowCorpoTexto5.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTexto5.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTexto5.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTexto5.setPaddingLeft(20f);
            
            PdfPCell cellRowCorpoTexto6 = new PdfPCell(new Paragraph("- Seu consumo resultar em operação de saída ou prestação para o exterior, na proporção destas sobre as saídas ou prestações totais.", fontCorpo));
            cellRowCorpoTexto6.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTexto6.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTexto6.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTexto6.setPaddingLeft(20f);
            
            PdfPCell cellRowCorpoTexto7 = new PdfPCell(new Paragraph("Especialmente no que diz respeito ao processo industrial, a norma é clara no sentido de que " +
            		"somente a energia elétrica aplicada diretamente na atividade industrial, gera direito a crédito (proporcional) do ICMS destacado na conta de energia.", fontCorpo));
            
            cellRowCorpoTexto7.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTexto7.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTexto7.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTexto7.setPaddingLeft(5f);
            
            PdfPCell cellRowCorpoTexto8 = new PdfPCell(new Paragraph("Em atendimento a legislação 9do ICMS vigente, no que refere-se o crédito relativo à aquisição " +
            		"de energia, vimos por meio deste apresentar a vossa empresa o orçamento com o objetivo de emitir laudo técnico de energia elétrica para o devido " +
            		"aproveitamento do crédito do ICMS.", fontCorpo));
            
            cellRowCorpoTexto8.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTexto8.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTexto8.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTexto8.setPaddingLeft(5f);
            
            PdfPCell cellRowCorpoTexto9 = new PdfPCell(new Paragraph("Abaixo segue valor calculado, para respectivo Laudo Técnico.", fontCorpo));
            
            cellRowCorpoTexto9.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTexto9.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTexto9.setPaddingLeft(5f);
            cellRowCorpoTexto9.setPaddingBottom(10f);
                        
            tableCorpoTexto.addCell(cellRowCorpoTextoTitulo);
            tableCorpoTexto.addCell(cellRowCorpoTexto1);
            tableCorpoTexto.addCell(cellRowCorpoTexto2);
            tableCorpoTexto.addCell(cellRowCorpoTexto3);
            tableCorpoTexto.addCell(cellRowCorpoTexto4);
            tableCorpoTexto.addCell(cellRowCorpoTexto5);
            tableCorpoTexto.addCell(cellRowCorpoTexto6);
            tableCorpoTexto.addCell(cellRowCorpoTexto7);
            tableCorpoTexto.addCell(cellRowCorpoTexto8);
            tableCorpoTexto.addCell(cellRowCorpoTexto9);
            
            //Preço e prazo da execução
            PdfPTable tableCorpoTextoValor = new PdfPTable(1);            
                        
            tableCorpoTextoValor.setWidths(fCorpoTexto);
            tableCorpoTextoValor.setWidthPercentage(100f);
            //tableCorpoTextoValor.setSpacingAfter(20f);
            
            PdfPCell cellRowCorpoTextoValor1 = new PdfPCell(new Paragraph("Prazo para execução da consultoria: ______ dias",fontCorpoValor));          		
            
            cellRowCorpoTextoValor1.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTextoValor1.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpoTextoValor1.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpoTextoValor1.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTextoValor1.setHorizontalAlignment(Element.ALIGN_RIGHT);
            cellRowCorpoTextoValor1.setPaddingTop(5f);
            cellRowCorpoTextoValor1.setPaddingRight(5f);
            
            DecimalFormat df = new DecimalFormat("R$ #,##0.00", new DecimalFormatSymbols(new Locale("pt", "BR")));
            PdfPCell cellRowCorpoTextoValor2 = new PdfPCell(new Paragraph("Valor total para desenvolvimento do laudo técnico: " + df.format(getTotalOrcamentoDesconto()) ,fontCorpoValor));          		
            
            cellRowCorpoTextoValor2.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTextoValor2.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpoTextoValor2.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpoTextoValor2.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTextoValor2.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTextoValor2.setHorizontalAlignment(Element.ALIGN_RIGHT);
            cellRowCorpoTextoValor2.setPaddingRight(5f);
                        
            PdfPCell cellRowCorpoTextoValor3 = new PdfPCell(new Paragraph("Validade da proposta: ______ dias",fontCorpoValor));          		
            
            cellRowCorpoTextoValor3.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTextoValor3.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpoTextoValor3.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpoTextoValor3.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTextoValor3.setHorizontalAlignment(Element.ALIGN_RIGHT);
            cellRowCorpoTextoValor3.setPaddingRight(5f);
            cellRowCorpoTextoValor3.setPaddingBottom(10f);
            
            tableCorpoTextoValor.addCell(cellRowCorpoTextoValor1);
            tableCorpoTextoValor.addCell(cellRowCorpoTextoValor2);
            tableCorpoTextoValor.addCell(cellRowCorpoTextoValor3);
            
            //Itens da consultoria
            PdfPTable tableCorpoTextoItens = new PdfPTable(1);            
                        
            tableCorpoTextoItens.setWidths(fCorpoTexto);
            tableCorpoTextoItens.setWidthPercentage(100f);
            //tableCorpoTextoItens.setSpacingAfter(20f);
            
            PdfPCell cellRowCorpoTextoItensTitulo = new PdfPCell(new Paragraph("Ítens da Consultoria",fontCorpoTitulo));          		
            
            cellRowCorpoTextoItensTitulo.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTextoItensTitulo.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpoTextoItensTitulo.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpoTextoItensTitulo.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTextoItensTitulo.setHorizontalAlignment(Element.ALIGN_LEFT);
                        
            PdfPCell cellRowCorpoTextoItens1 = new PdfPCell(new Paragraph("- Visita de Apresentação para Levantamento das informações necessárias a Execução do Laudo Técnico;",fontCorpo));          		
            
            cellRowCorpoTextoItens1.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTextoItens1.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTextoItens1.setPaddingTop(5f);
            cellRowCorpoTextoItens1.setPaddingLeft(5f);
            
            PdfPCell cellRowCorpoTextoItens2 = new PdfPCell(new Paragraph("- Levantamento de Carga Instalada dos Equipamentos Elétricos dos setores de Produção e Adm. da Empresa;",fontCorpo));          		
            
            cellRowCorpoTextoItens2.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTextoItens2.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTextoItens2.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTextoItens2.setPaddingLeft(5f);
            
            PdfPCell cellRowCorpoTextoItens3 = new PdfPCell(new Paragraph("- Acessos a faturas de Consumo de Energia Elétrica por (UC), Unidade Consumidora de Energia Elétrica;",fontCorpo));          		
            
            cellRowCorpoTextoItens3.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTextoItens3.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTextoItens3.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTextoItens3.setPaddingLeft(5f);
            
            PdfPCell cellRowCorpoTextoItens4 = new PdfPCell(new Paragraph("- Acompanhamento de pessoal para a Vistoria Técnica das instalações, objetivando avalizar os setores de Produção e Administrativos das Instalações;",fontCorpo));          		
            
            cellRowCorpoTextoItens4.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTextoItens4.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTextoItens4.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTextoItens4.setPaddingLeft(5f);
            
            PdfPCell cellRowCorpoTextoItens5 = new PdfPCell(new Paragraph("- Elaboração do Layout Físico dos setores de Produção e Administrativos das Unidades Industriais com Mapeamento de Cargas por setor.",fontCorpo));          		
                        
            cellRowCorpoTextoItens5.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTextoItens5.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTextoItens5.setPaddingLeft(5f);
            cellRowCorpoTextoItens5.setPaddingBottom(10f);
            
            tableCorpoTextoItens.addCell(cellRowCorpoTextoItensTitulo);
            tableCorpoTextoItens.addCell(cellRowCorpoTextoItens1);
            tableCorpoTextoItens.addCell(cellRowCorpoTextoItens2);
            tableCorpoTextoItens.addCell(cellRowCorpoTextoItens3);
            tableCorpoTextoItens.addCell(cellRowCorpoTextoItens4);
            tableCorpoTextoItens.addCell(cellRowCorpoTextoItens5);
            
            //Texto final do orçamento
            PdfPTable tableCorpoTextoFinal = new PdfPTable(1);            
                        
            tableCorpoTextoFinal.setWidths(fCorpoTexto);
            tableCorpoTextoFinal.setWidthPercentage(100f);
            tableCorpoTextoFinal.setSpacingAfter(20f);
            
            PdfPCell cellRowCorpoTextoFinal1 = new PdfPCell(new Paragraph("Concordando com as Condições Técnicas Comerciais da referida proposta ou maiores informações estaremos prontamente a disposição para esclarecimentos.", fontCorpoNegrito));          		
            
            cellRowCorpoTextoFinal1.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTextoFinal1.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpoTextoFinal1.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpoTextoFinal1.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTextoFinal1.setHorizontalAlignment(Element.ALIGN_LEFT);
            cellRowCorpoTextoFinal1.setPaddingTop(5f);
            cellRowCorpoTextoFinal1.setPaddingLeft(5f);
            
            PdfPCell cellRowCorpoTextoFinal2 = new PdfPCell(new Paragraph("Sem mais, aguardamos o seu retorno.", fontCorpoNegrito));          		
            
            cellRowCorpoTextoFinal2.disableBorderSide(PdfPCell.TOP);
            cellRowCorpoTextoFinal2.disableBorderSide(PdfPCell.LEFT);
            cellRowCorpoTextoFinal2.disableBorderSide(PdfPCell.RIGHT);
            cellRowCorpoTextoFinal2.disableBorderSide(PdfPCell.BOTTOM);
            cellRowCorpoTextoFinal2.setHorizontalAlignment(Element.ALIGN_RIGHT);
            cellRowCorpoTextoFinal2.setPaddingRight(5f);
            
            tableCorpoTextoFinal.addCell(cellRowCorpoTextoFinal1);
            tableCorpoTextoFinal.addCell(cellRowCorpoTextoFinal2);
                        
            //Rodapé do orçamento
            PdfPTable tableRodape = new PdfPTable(1);            
                        
            tableRodape.setWidths(fCorpoTexto);
            tableRodape.setWidthPercentage(100f);
                        
            PdfPCell cellRowRodape1 = new PdfPCell(new Paragraph("Rua Milton Cury, 20 - CEP 15077-460 Bairro Chácara Bela Vista 2", fontRodape));          		
            
            cellRowRodape1.disableBorderSide(PdfPCell.TOP);
            cellRowRodape1.disableBorderSide(PdfPCell.LEFT);
            cellRowRodape1.disableBorderSide(PdfPCell.RIGHT);
            cellRowRodape1.disableBorderSide(PdfPCell.BOTTOM);
            cellRowRodape1.setHorizontalAlignment(Element.ALIGN_CENTER);
            cellRowRodape1.setBackgroundColor(new Color(23, 55, 94));
            
            PdfPCell cellRowRodape2 = new PdfPCell(new Paragraph("São José do Rio Preto/SP - Tel. 55 17 3808-1187 / 9622-7078", fontRodape));          		
            
            cellRowRodape2.disableBorderSide(PdfPCell.TOP);
            cellRowRodape2.disableBorderSide(PdfPCell.LEFT);
            cellRowRodape2.disableBorderSide(PdfPCell.RIGHT);
            cellRowRodape2.disableBorderSide(PdfPCell.BOTTOM);
            cellRowRodape2.setHorizontalAlignment(Element.ALIGN_CENTER);
            cellRowRodape2.setBackgroundColor(new Color(23, 55, 94));
            
            PdfPCell cellRowRodape3 = new PdfPCell(new Paragraph("E-mail: informse@inforseenergia.com.br", fontRodape));          		
            
            cellRowRodape3.disableBorderSide(PdfPCell.TOP);
            cellRowRodape3.disableBorderSide(PdfPCell.LEFT);
            cellRowRodape3.disableBorderSide(PdfPCell.RIGHT);
            cellRowRodape3.disableBorderSide(PdfPCell.BOTTOM);
            cellRowRodape3.setHorizontalAlignment(Element.ALIGN_CENTER);
            cellRowRodape3.setBackgroundColor(new Color(23, 55, 94));
            
            tableRodape.addCell(cellRowRodape1);
            tableRodape.addCell(cellRowRodape2);
            tableRodape.addCell(cellRowRodape3);
                        
            document.add(logoCabecalho);
            document.add(tableCorpo);
            document.add(tableCorpoTexto);
            document.add(tableCorpoTextoValor);
            document.add(tableCorpoTextoItens);
            document.add(tableCorpoTextoFinal);
            document.add(tableRodape);
            
            document.close();

            res.setContentType("application/pdf");  
			//Código abaixo gerar o relatório e disponibiliza diretamente na página   
			res.setHeader("Content-disposition", "inline;filename=Orçamento.pdf");  
			//Código abaixo gerar o relatório e disponibiliza para o cliente baixar ou salvar   
			//res.setHeader("Content-disposition", "attachment;filename=Orçamento.pdf"); 
			res.getCharacterEncoding();
            res.setContentLength(baos.size());
            // write ByteArrayOutputStream to the ServletOutputStream
            OutputStream os = res.getOutputStream();
            baos.writeTo(os);
            os.flush();
            os.close();
            
			FacesContext.getCurrentInstance().responseComplete();
        		
        } catch (DocumentException de) {
                System.err.println(de.getMessage());
        } catch (IOException ioe) {
                System.err.println(ioe.getMessage());
        }
	}
	
	private void limparProfissional(){
		setCustoProfissionais(new CustoProfissionais());
	}
	

	private void limparEncargo(){
		setEncargo(new Encargo());
	}
	
	public void calcularEncargosProLabore(){
		setEncargosProLabore(getSelectedOrcamento().getValorOrcamento().getCustoFixo().getProLabore() * 0.25f);
		calcularCustoTotalCustoHora();
	}
	
	public void calcularEncargosSociaisProLabore(){
		setEncargosSociaisProLabore(getSelectedOrcamento().getValorOrcamento().getCustoFixo().getSalarioAdministrativo() * 0.35f);
		calcularCustoTotalCustoHora();
	}
	
	public void calcularDespesaCarro(){
		calcularTotalGasto();
		calcularConsumoLitro();
		calcularDepreciacaoVeicular();
	}
	
	public void calcularAlimentacao(){
		calcularQtdProfissionais();
		calcularTotalAlimentacao();
	}
	
	public void calcularAcomodacao(){
		calcularQtdProfissionais();
		calcularTotalAcomodacao();
	}
	
	public void calcularTransporteAereo(){
		setTotalTransporteAereo(getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getQtdPassagem() * getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getValorPassagem());
	}
	
	public void calcularAluguelCarro(){
		setTotalAluguelCarro(getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getQtdDiasAluguelCarro() * getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getValorAluguelCarro());
	}
	
	public void calcularTotalCustoOperacional(){
		setTotalCustoOperacional(getTotalGasto() + getTotalAlimentacao() + getTotalAcomodacao() + getTotalAluguelCarro() + getDepreciacaoVeicular() + getTotalTransporteAereo() + getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getPedagio() + getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getPertinentes());
	}
	
	private void calcularQtdProfissionais(){
		setQtdTotalProfissionais(listaProfissionais.size());
	}
	
	private void calcularTotalAlimentacao(){
		setTotalAlimentacao(getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getDiasAlimentacao() * 
									getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getQtdRefeicoes() * 
											getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getValorRefeicao() * getQtdTotalProfissionais());
	}
	
	private void calcularTotalAcomodacao(){
		setTotalAcomodacao(getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getDiasAcomodacao() * 
									getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getValorAcomodacao() * getQtdTotalProfissionais());
	}
	
	private void calcularTotalGasto(){
		setTotalGasto(getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getKmRodados() / 
								getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getKmLitro() * 
											getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getValorLitro());
	}
	
	private void calcularConsumoLitro(){
		setConsumoLitro(getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getKmRodados() / getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getKmLitro());
	}
	
	private void calcularDepreciacaoVeicular(){
		setDepreciacaoVeicular(getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getKmRodados() * getSelectedOrcamento().getValorOrcamento().getCustoOperacional().getValorDepreciacao());
	}
	
	public void calcularCustoTotalCustoHora(){
		setTotalCusto(getSelectedOrcamento().getValorOrcamento().getCustoFixo().getAgua() +
						getSelectedOrcamento().getValorOrcamento().getCustoFixo().getAluguel() +
							getSelectedOrcamento().getValorOrcamento().getCustoFixo().getDespesasBancarias() +
								getSelectedOrcamento().getValorOrcamento().getCustoFixo().getDespesaViagens() +
									getSelectedOrcamento().getValorOrcamento().getCustoFixo().getHonorariosContabeis() +
										getSelectedOrcamento().getValorOrcamento().getCustoFixo().getJuros() +
											getSelectedOrcamento().getValorOrcamento().getCustoFixo().getLuz() +
												getSelectedOrcamento().getValorOrcamento().getCustoFixo().getManutencaoVeicular() +
													getSelectedOrcamento().getValorOrcamento().getCustoFixo().getMaterialExpediente() +
														getSelectedOrcamento().getValorOrcamento().getCustoFixo().getPertinentesVariados() +
															getSelectedOrcamento().getValorOrcamento().getCustoFixo().getProLabore() +
																getSelectedOrcamento().getValorOrcamento().getCustoFixo().getPublicidade() +
																	getSelectedOrcamento().getValorOrcamento().getCustoFixo().getSalarioAdministrativo() +
																		getSelectedOrcamento().getValorOrcamento().getCustoFixo().getSeguros() +
																		 	getSelectedOrcamento().getValorOrcamento().getCustoFixo().getTelefone() +
																		 		getSelectedOrcamento().getValorOrcamento().getCustoFixo().getServicosInternet() +
																		 			getSelectedOrcamento().getValorOrcamento().getCustoFixo().getOutros() +
																		 				getEncargosProLabore() +
																		 					getEncargosSociaisProLabore());
		setValorCustoHora(getTotalCusto() / getSelectedOrcamento().getValorOrcamento().getCustoFixo().getQtdHorasMes());
	}
	
	public void calcularTotalOrcamento(){
		float valorHoraProfissionais = 0;
		float porcentagemEncargos = 0;		
		
		for(CustoProfissionais c : listaProfissionais){
			valorHoraProfissionais += c.getCustoHora();
		}
		
		for(Encargo e : listaEncargos){
			porcentagemEncargos += e.getPorcentagemEncargo();
		}
		
		getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().setQtdHorasCustoFixo(getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getQtdHorasViagem() + 
																									getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getQtdHorasVistoria() +
																											getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getQtdHorasComplementos());
		
		setTotalOrcamento(getValorCustoHora() * getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getQtdHorasCustoFixo() +
								valorHoraProfissionais * getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getQtdHorasViagem() +
										valorHoraProfissionais * getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getQtdHorasVistoria() +
												valorHoraProfissionais * getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getQtdHorasComplementos());
		
		//adiciona o custo operacional
		setTotalOrcamento(getTotalOrcamento() + getTotalCustoOperacional());		
		
		getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().setValorLucro(getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getPorcentagemLucro() * getTotalOrcamento() / 100);
		
		//adiciona a porcentagem de Lucro
		setTotalOrcamento(getTotalOrcamento() + getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getValorLucro());
		
		//adiciona o valor dos encargos
		setTotalOrcamento((1 + porcentagemEncargos / 100) * getTotalOrcamento());
		
		
		
		calcularTotalOrcamentoDesconto();		
	}
	
	private void calcularTotalOrcamentoDesconto(){
		setTotalOrcamentoDesconto(getTotalOrcamento() * (1 - getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getDescontoOrcamento() / 100));
	}
	
	private void calcularOrcamento(){
		float valorHoraProfissionais = 0;
		float porcentagemEncargos = 0;
		
		listaProfissionais.clear();
		listaEncargos.clear();
		
		for(CustoProfissionais c : getSelectedOrcamento().getValorOrcamento().getCustoProfissionaisSets()){
			listaProfissionais.add(c);			
			valorHoraProfissionais += c.getCustoHora();
		}
		
		for(Encargo e : getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getEncargoSets()){
			listaEncargos.add(e);
			porcentagemEncargos += e.getPorcentagemEncargo();
		}
		
		calcularEncargosProLabore();
		calcularEncargosSociaisProLabore();
		prepararInserirCustoOperacional();
				
		setTotalOrcamento(getValorCustoHora() * getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getQtdHorasCustoFixo() +
								valorHoraProfissionais * getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getQtdHorasViagem() +
										valorHoraProfissionais * getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getQtdHorasVistoria() +
												valorHoraProfissionais * getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getQtdHorasComplementos());
		
		//adiciona o custo operacional
		setTotalOrcamento(getTotalOrcamento() + getTotalCustoOperacional());		
		
		//adiciona a porcentagem de Lucro
		setTotalOrcamento((1 + getSelectedOrcamento().getValorOrcamento().getTotalOrcamental().getPorcentagemLucro() / 100) * getTotalOrcamento());
				
		//adiciona o valor dos encargos
		setTotalOrcamento((1 + porcentagemEncargos / 100) * getTotalOrcamento());
		
		calcularTotalOrcamentoDesconto();
		
		listaProfissionais.clear();
		listaEncargos.clear();
	}
	
	public void inserirCustoFixo(ActionEvent event){
		ValorOrcamentoDAO.inserirCustoFixo(getSelectedOrcamento().getValorOrcamento(), getSelectedOrcamento().getId());			
	}
	
	public void inserirCustoOperacional(ActionEvent event){
		ValorOrcamentoDAO.inserirCustoOperacional(getSelectedOrcamento().getValorOrcamento(), getSelectedOrcamento().getId());			
	}
	
	public void inserirTotalOrcamental(ActionEvent event){
		ValorOrcamentoDAO.inserirTotalOrcamental(getSelectedOrcamento().getValorOrcamento().getTotalOrcamental(), getSelectedOrcamento().getId());
		//gerarOrcamento(event);
	}

	public List<Orcamento> getListaOrcamentos() {
		return listaOrcamentos;
	}

	public void setListaOrcamentos(List<Orcamento> listaOrcamentos) {
		this.listaOrcamentos = listaOrcamentos;
	}

	public Orcamento getSelectedOrcamento() {
		return selectedOrcamento;
	}

	public void setSelectedOrcamento(Orcamento selectedOrcamento) {
		this.selectedOrcamento = selectedOrcamento;
	}

	public Orcamento getOrcamento() {
		return orcamento;
	}

	public void setOrcamento(Orcamento orcamento) {
		this.orcamento = orcamento;
	}

	public float getEncargosProLabore() {
		return encargosProLabore;
	}

	public void setEncargosProLabore(float encargosProLabore) {
		this.encargosProLabore = encargosProLabore;
	}

	public float getEncargosSociaisProLabore() {
		return encargosSociaisProLabore;
	}

	public void setEncargosSociaisProLabore(float encargosSociaisProLabore) {
		this.encargosSociaisProLabore = encargosSociaisProLabore;
	}

	public float getTotalCusto() {
		return totalCusto;
	}

	public void setTotalCusto(float totalCusto) {
		this.totalCusto = totalCusto;
	}

	public float getValorCustoHora() {
		return valorCustoHora;
	}

	public void setValorCustoHora(float valorCustoHora) {
		this.valorCustoHora = valorCustoHora;
	}

	public CustoProfissionais getCustoProfissionais() {
		return custoProfissionais;
	}

	public void setCustoProfissionais(CustoProfissionais custoProfissionais) {
		this.custoProfissionais = custoProfissionais;
	}

	public CustoProfissionais getSelectedCustoProfissionais() {
		return selectedCustoProfissionais;
	}

	public void setSelectedCustoProfissionais(
			CustoProfissionais selectedCustoProfissionais) {
		this.selectedCustoProfissionais = selectedCustoProfissionais;
	}

	public List<CustoProfissionais> getListaProfissionais() {
		return listaProfissionais;
	}

	public void setListaProfissionais(List<CustoProfissionais> listaProfissionais) {
		this.listaProfissionais = listaProfissionais;
	}	

	public float getTotalGasto() {
		return totalGasto;
	}

	public void setTotalGasto(float totalGasto) {
		this.totalGasto = totalGasto;
	}

	public float getConsumoLitro() {
		return consumoLitro;
	}

	public void setConsumoLitro(float consumoLitro) {
		this.consumoLitro = consumoLitro;
	}

	public float getDepreciacaoVeicular() {
		return depreciacaoVeicular;
	}

	public void setDepreciacaoVeicular(float depreciacaoVeicular) {
		this.depreciacaoVeicular = depreciacaoVeicular;
	}

	public float getQtdTotalProfissionais() {
		return qtdTotalProfissionais;
	}

	public void setQtdTotalProfissionais(float qtdTotalProfissionais) {
		this.qtdTotalProfissionais = qtdTotalProfissionais;
	}

	public float getTotalAlimentacao() {
		return totalAlimentacao;
	}

	public void setTotalAlimentacao(float totalAlimentacao) {
		this.totalAlimentacao = totalAlimentacao;
	}

	public float getTotalAcomodacao() {
		return totalAcomodacao;
	}

	public void setTotalAcomodacao(float totalAcomodacao) {
		this.totalAcomodacao = totalAcomodacao;
	}

	public float getTotalTransporteAereo() {
		return totalTransporteAereo;
	}

	public void setTotalTransporteAereo(float totalTransporteAereo) {
		this.totalTransporteAereo = totalTransporteAereo;
	}

	public float getTotalCustoOperacional() {
		return totalCustoOperacional;
	}

	public void setTotalCustoOperacional(float totalCustoOperacional) {
		this.totalCustoOperacional = totalCustoOperacional;
	}

	public Encargo getEncargo() {
		return encargo;
	}

	public void setEncargo(Encargo encargo) {
		this.encargo = encargo;
	}

	public Encargo getSelectedEncargo() {
		return selectedEncargo;
	}

	public void setSelectedEncargo(Encargo selectedEncargo) {
		this.selectedEncargo = selectedEncargo;
	}

	public List<Encargo> getListaEncargos() {
		return listaEncargos;
	}

	public void setListaEncargos(List<Encargo> listaEncargos) {
		this.listaEncargos = listaEncargos;
	}

	public float getTotalOrcamento() {
		return totalOrcamento;
	}

	public void setTotalOrcamento(float totalOrcamento) {
		this.totalOrcamento = totalOrcamento;
	}

	public float getTotalOrcamentoDesconto() {
		return totalOrcamentoDesconto;
	}

	public void setTotalOrcamentoDesconto(float totalOrcamentoDesconto) {
		this.totalOrcamentoDesconto = totalOrcamentoDesconto;
	}

	public float getTotalAluguelCarro() {
		return totalAluguelCarro;
	}

	public void setTotalAluguelCarro(float totalAluguelCarro) {
		this.totalAluguelCarro = totalAluguelCarro;
	}		
}
